package com.buddy.summary.code.algorithm;

import java.util.Arrays;

public class BitMap {
    //每一个work是一个long类型元素，对应一个64位二进制数据
    private long[] words;
    //BitMap的位数大小
    private int size;
    public BitMap(int size){
        this.size = size;
        this.words = new long[getWordIndex(size -1)+1];
    }

    /**
     * 判断BitMap某一位的状态
     * @param bitIndex 位图的第bitIndex位
     */
    public boolean getBit(int bitIndex){
        if (bitIndex < 0 || bitIndex > size -1)
            throw new IndexOutOfBoundsException("超出BitMap有效范围");
        //定位到words中的对应的long元素
        int wordIndex = getWordIndex(bitIndex);
        //判断long元素的对应的二进制是否为1
        return (words[wordIndex] & (1L << bitIndex)) != 0;
    }

    /**
     * 把BitMap某一位设为true
     * @param bitIndex 位图的bitIndex位
     */
    public void setBit(int bitIndex){
        if (bitIndex < 0 || bitIndex > size -1)
            throw new IndexOutOfBoundsException("超出BitMap有效范围");
        //定位到words中的对应的long元素
        int wordIndex = getWordIndex(bitIndex);
        //通过与运算修改long元素的值
        words[wordIndex] |= (1L << bitIndex);
    }



    /**
     * 定位BitMap某一位所对应的word
     * @param bitIndex 位图的第bitIndex位
     */
    private int getWordIndex(int bitIndex) {
        //右移6位，相当于除以64
        return bitIndex >> 6;
    }

    public static void main(String[] args) {
        BitMap bitMap = new BitMap(128);
        bitMap.setBit(126);
        bitMap.setBit(75);
        bitMap.setBit(1);
        System.out.println(bitMap.getBit(126));
        System.out.println(bitMap.getBit(75));
        System.out.println(bitMap.getBit(1));
        System.out.println(Arrays.toString(bitMap.words));
    }

}
